#!/usr/bin/env python
#-*- encoding: utf-8 -*-

from hashlib import sha1
from random import randint
from Tkinter import *
from tkMessageBox import showinfo
from ConfigParser import ConfigParser
try:
    from ttk import *
except:
    pass

#config
config = ConfigParser()
config.read('almir.ini')
template_file = config.get('template', 'filename')
pass_range = dict(
                start = int(config.get('range', 'start')),
                end = int(config.get('range', 'end'))
                )


def ler_modelo():
        modelo_file = open(template_file)
        ret = modelo_file.read()
        modelo_file.close()
        return ret

class HashPassword (object):

    def __init__(self, master):

        self.master = master
        master.grid()
        self.modelo = ler_modelo()
        #Menubar
        menubar = Menu(master)
        menubar.add_command(label="Modelo", command=self.config)
        menubar.add_command(label="Sobre", command=self.sobre)
        master.config(menu=menubar)

        lbl = Label(master,
                          text = 'Insira os dados abaixo, um por linha:')
        lbl.grid(row=0, column=0, sticky='nw')
        self.txt = Text(master)
        self.txt.grid(row=1, column=0, sticky='nsew')
        
        btn = Button(master, text='Vai Almir!!', command=self.hash)
        btn.grid(row=2,column=0, ipady=5, pady=5, sticky='')
        
        master.columnconfigure(0,weight=1)
        master.rowconfigure(1, weight=1)
        
    def config(self):
        conf = ConfigDialog(self.master)
        self.master.wait_window(conf.top)

    def sobre(self):
        text = """Almir Hash Password
Autor: Rafael Pinheiro
Licença: GPLv3
Descrição:
Gera senhas aleatórias para várias entradas que podem ser algo como um nome de usuário.
A saída é definida de acordo com um modelo definido pelo usuário."""
        showinfo('Sobre', text, parent = self.master)

    def hash(self):
        texto = self.txt.get(1.0, END)
        self.txt.delete(1.0, END)
        map(self.gera_senha, texto.splitlines())
    
    def gera_senha(self, cpf):
        senha = str(randint(pass_range['start'],pass_range['end']))
        texto= self.modelo % {'senha': sha1(senha).hexdigest(),
                              'senha_plain': senha,
                              'input': cpf}
        self.txt.insert(END, texto)

class ConfigDialog (object):

    def __init__(self, parent):
        top = self.top = Toplevel(parent)
        self.parent = parent
        top.config(bd=5)
        top.columnconfigure(0, weight=1)
        top.rowconfigure(1, weight=1)
        texto = '''Modelo para gerar a saída.
Substituição:
    %(senha)s : senha criptografada
    %(senha_plain)s : senha sem criptografia
    %(input)s : dado passado como entrada
'''
     
        lbl_modelo = Label(top, text=texto, justify=LEFT)
        lbl_modelo.grid(row=0,column=0, sticky='w')
        self.txt_modelo = Text(top)
        self.txt_modelo.insert(END, ler_modelo())
        self.txt_modelo.grid(row=1, column=0, sticky='nswe')

        self.padrao = IntVar()
        chk_modelo = Checkbutton(top,
                                 text="Tornar modelo padrão",
                                 variable=self.padrao)
        chk_modelo.grid(row=2, column=0, sticky='w')
        
        btn_fechar = Button(top, text='Fechar',command=self.fechar)
        btn_fechar.grid(row=3, column=0, sticky='e')


    def fechar(self):
        main.modelo = self.txt_modelo.get(1.0, END)
        if self.padrao.get():
            modelo_file = open(template_file, 'w')
            modelo_file.write(main.modelo)
            modelo_file.close()
        self.top.destroy()


if __name__ == '__main__':
    root = Tk()
    root.title('Almir Hash Password')
    root.config(bd=10)
    main = HashPassword(root)
    root.mainloop()


